//////////////////////////////////////////////////////////////////////////
//
// GAM203
// Singleton Template
// Singleton.h
// 
// Grant Johnson
// Qantm College
// 27/10/2010
//
//////////////////////////////////////////////////////////////////////////

#ifndef SINGLETON_H
#define SINGLETON_H

#include <assert.h>
#include <stdio.h>

template <class T>
class Singleton
{
public:
	//////////////////////////////////////////////////////////////////////////
	//Initiate the templated instance
	//////////////////////////////////////////////////////////////////////////
	static void Init()
	{
		assert(m_pInstance == NULL);
		m_pInstance = new T();
	}


	//////////////////////////////////////////////////////////////////////////
	//Clean up the templated instance
	//////////////////////////////////////////////////////////////////////////
	static void Done()
	{
		assert(m_pInstance != NULL);
		if(m_pInstance != NULL)
		{
			delete m_pInstance;
			m_pInstance = NULL;
		}
	}


	//////////////////////////////////////////////////////////////////////////
	//Return a reference to the templated instance
	//////////////////////////////////////////////////////////////////////////
	static T& GetInstance()
	{
		assert(m_pInstance != NULL);
		return *m_pInstance;
	}

protected:
	Singleton(){}

private:
	//////////////////////////////////////////////////////////////////////////
	//Store an instance of templated type as a pointer
	//////////////////////////////////////////////////////////////////////////
	static T* m_pInstance;
};

#endif //SINGLETON_H